// 1 不匹配任何东西的正则
var regex=/.^/ //只有一个字符 但该字符后面是开头

// 2 数字的千分位分隔符表示法

// 分析 对于 12345678 变成12,345,678
// 可用 /(?=\d{3}$)/ 这样只有一个  于是 使用+
var result="12345678".replace(/(?=(\d{3})+$)/g,',');
console.log(result);
// 但是 123456789 开头也会有， ，123,456,789
// 那么再加一个 该位置不是开头 （？!^）
var result="123456789".replace(/(?!^)(?=(\d{3})+$)/g,',');
console.log(result);
// 如果"12345678 123456789"替换成"12,345,678 123,456,789"。
// 那么需要要以单词边界为准 要将 ^ $ 换成\b
var string = "12345678 123456789",
reg = /(?!\b)(?=(\d{3})+\b)/g;
var result = string.replace(reg, ',')
console.log(result);

// 3.验证密码问题
// 匹配 密码长度6-12位，由数字、小写字符和大写字母组成，但必须至少包括2种字符

// 分析
// 密码 [0-9a-zA-z]{6,12}
// 判断包含某种字符 比如数字 使用 (?=.*[0-9])  这是位置 某个模式前的位置 或 某个位置后是这个模式 
// 可以认为 在某个位置后是任意数量的字符 再加上一个数字 即 接下来的字符必须包含数字
// 不妨写成 
var reg=/(?=.*[0-9])^[0-9a-zA-z]{6-12}$/;
// 再看 (?=.*[0-9])^  ^ 表示开头 开头的位置还是开头 以包含数字的字符(串)开头
// 同时包含数字和小写字母 就可以写成 (?=.*[0-9])(?=.*[a-Z]) 于是
var reg=/(?=.*[0-9])(?=.*[a-z])^[0-9a-zA-z]{6-12}$/;
// 于是有
var reg = /((?=.*[0-9])(?=.*[a-z])|(?=.*[0-9])(?=.*[A-Z])|(?=.*[a-z])(?=.*[A-Z]))^[0-9A-Za-z]{6,12}$/;

// 换一个角度
// 也就是说不能全是数字或大小写字母
// 那么 (?!p)

// 不全是数字 (?!^[0-9]{6,12}$)

// 那么有
var reg = /(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[0-9A-Za-z]{6,12}$/;
console.log( reg.test("1234567") ); // false 全是数字
console.log( reg.test("abcdef") ); // false 全是小写字母
console.log( reg.test("ABCDEFGH") ); // false 全是大写字母
console.log( reg.test("ab23C") ); // false 不足6位
console.log( reg.test("ABCDEF234") ); // true 大写字母和数字
console.log( reg.test("abcdEF234") ); // true 三者都有

